package com.sh.rbac.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sh.rbac.domain.converter.LoginLogConverter;
import com.sh.rbac.domain.dto.loginLog.LoginLogQueryDTO;
import com.sh.rbac.domain.entity.LoginLog;
import com.sh.rbac.domain.vo.loginLog.LoginLogEeVO;
import com.sh.rbac.domain.vo.loginLog.LoginLogVO;
import com.sh.rbac.handler.LoginLogCellStyleHandler;
import com.sh.rbac.mapper.LoginLogMapper;
import com.sh.rbac.service.LoginLogService;
import com.sh.rbac.core.common.util.ExcelUtils;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author lucky
 * @description 针对表【sys_login_log(登录日志记录表)】的数据库操作Service实现
 * @createDate 2024-07-01 20:35:59
 */
@Service
public class LoginLogServiceImpl extends ServiceImpl<LoginLogMapper, LoginLog>
        implements LoginLogService {

    @Override
    public Page<LoginLogVO> getPage(Long current, Long limit, LoginLogQueryDTO loginLogQueryDTO) {
        // 创建 page 对象，传递当前页, 每页记录数
        Page<LoginLog> page = new Page<>(current, limit);

        // 条件参数
        String username = loginLogQueryDTO.getUsername();
        Integer loginStatus = loginLogQueryDTO.getLoginStatus();

        String startTime = null;
        String endTime = null;
        if (loginLogQueryDTO.getLoginTimes() != null) {
            startTime = loginLogQueryDTO.getLoginTimes()[0];
            endTime = loginLogQueryDTO.getLoginTimes()[1];
        }

        // 构建条件
        LambdaQueryWrapper<LoginLog> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StrUtil.isNotBlank(username), LoginLog::getUsername, username)
                .eq(loginStatus != null, LoginLog::getLoginStatus, loginStatus)
                .between(StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime), LoginLog::getLoginTime, startTime, endTime);

        // 根据修改时间倒序
        queryWrapper.orderByDesc(LoginLog::getLoginTime);

        // 查询数据
        Page<LoginLog> loginLogPage = baseMapper.selectPage(page, queryWrapper);

        // 转换数据
        Page<LoginLogVO> loginLogVO = new Page<>();
        loginLogVO.setTotal(loginLogPage.getTotal());
        loginLogVO.setSize(loginLogPage.getSize());
        loginLogVO.setCurrent(loginLogPage.getCurrent());
        loginLogVO.setRecords(LoginLogConverter.INSTANCE.convertToLoginLogVOList(loginLogPage.getRecords()));
        loginLogVO.setPages(loginLogPage.getPages());

        return loginLogVO;
    }

    @Override
    public void exportData(Integer startCount, Integer endCount, HttpServletResponse response) {
        Page<LoginLog> page = new Page<>(startCount, endCount);
        List<LoginLog> records = baseMapper.selectPage(page, null).getRecords();
        List<LoginLogVO> loginLogVOList = LoginLogConverter.INSTANCE.convertToLoginLogVOList(records);
        ExcelUtils.exportDataToExcel(response, "登录日志", LoginLogEeVO.class, new LoginLogCellStyleHandler(), loginLogVOList);

    }
}




